/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package camada.bancodedados.daoimplemente;

import camada.bancodedados.conexao.Conexao;
import camada.negocio.dao.UsuarioDAO;
import eloma.classe.Usuario;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Icaro
 */
public class UsuarioDAOImpl implements UsuarioDAO {

    private static Connection con;
    PreparedStatement stmt = null;
    ResultSet rs = null;

    @Override
    public void inserir(Usuario usuario) throws Exception {

        try {

            con = Conexao.getCon();
            con.setAutoCommit(false);

            final String SQL_SCRIPT = "insert into Usuario (nome,login,senha) values (?,?,?)";

            stmt = con.prepareStatement(SQL_SCRIPT);
            stmt.setString(1, usuario.getNome());
            stmt.setString(2, usuario.getLogin());
            stmt.setString(3, usuario.getSenha());
            stmt.executeUpdate();

            con.commit();

        } catch (SQLException ex) {
            con.rollback();
        } catch (Exception e) {
            con.rollback();
        }
    }

    @Override
    public void atualizar(Usuario usuario) throws Exception {

        try {

            con = Conexao.getCon();
            con.setAutoCommit(false);

            final String SQL_SCRIPT = "update usuario set nome = ? , login = ? , senha = ? where idusuario = ?";

            stmt = con.prepareStatement(SQL_SCRIPT);
            stmt.setString(1, usuario.getNome());
            stmt.setString(2, usuario.getLogin());
            stmt.setString(3, usuario.getSenha());
            stmt.setInt(4, usuario.getIdUsuario());

            stmt.executeUpdate();

            con.commit();

        } catch (SQLException e) {
            con.rollback();
        } catch (Exception e) {
            con.rollback();
        }
    }

    @Override
    public void remover(Usuario usuario) throws Exception {

        try {

            con = Conexao.getCon();
            con.setAutoCommit(false);

            final String SQL_SCRIPT = "delete from Usuario where idusuario = ?";

            stmt = Conexao.getCon().prepareStatement(SQL_SCRIPT);
            stmt.setInt(1, usuario.getIdUsuario());
            stmt.executeUpdate();

            con.commit();

        } catch (SQLException e) {
            con.rollback();
        } catch (Exception e) {
            con.rollback();
        }

    }

    @Override
    public List<Usuario> buscaTodos() throws Exception {

        try {

            con = Conexao.getCon();
            con.setAutoCommit(false);

            final String SQL_SCRIPT = "select * from usuario order by idUsuario";

            stmt = con.prepareStatement(SQL_SCRIPT);
            rs = stmt.executeQuery();

            con.commit();

        } catch (SQLException ex) {
            con.rollback();
        } catch (Exception e) {
            con.rollback();
        }

        return carregarMultiplosResultados(rs);

    }

    @Override
    public Usuario buscaUsuarioLoginSenha(String login, String senha) throws Exception {

        try {

            con = Conexao.getCon();
            con.setAutoCommit(false);

            final String SQL_SCRIPT = "select * from Usuario where Login = ? and senha = ?";

            stmt = con.prepareStatement(SQL_SCRIPT);
            stmt.setString(1, login);
            stmt.setString(2, senha);
            rs = stmt.executeQuery();

            con.commit();

        } catch (SQLException sqle) {
            con.rollback();
        } catch (Exception e) {
            con.rollback();
        }

        return carregarResultadoSimples(rs);

    }

    @Override
    public List<Usuario> buscaTodoNome(String nome) throws Exception {

        try {

            con = Conexao.getCon();
            con.setAutoCommit(false);

            final String SQL_SCRIPT = "select * from usuario where nome like '%" + nome + "%'";

            stmt = con.prepareStatement(SQL_SCRIPT);
            rs = stmt.executeQuery();

            con.commit();

        } catch (SQLException ex) {
            con.rollback();
        } catch (Exception e) {
            con.rollback();
        }

        return carregarMultiplosResultados(rs);

    }

    @Override
    public Usuario buscaUsuarioNome(String nome) throws Exception {

        try {

            con = Conexao.getCon();
            con.setAutoCommit(false);

            final String SQL_SCRIPT = "select * from Usuario where nome like = ?";

            stmt = con.prepareStatement(SQL_SCRIPT);
            stmt.setString(1, nome);
            rs = stmt.executeQuery();

            con.commit();

        } catch (SQLException sqle) {
            con.rollback();
        } catch (Exception e) {
            con.rollback();
        }

        return carregarResultadoSimples(rs);

    }

    public List<Usuario> carregarMultiplosResultados(ResultSet rs) throws Exception {

        List<Usuario> resultList = new ArrayList<Usuario>();

        while (rs.next()) {
            Usuario dto = new Usuario();
            carregarVO(dto, rs);
            resultList.add(dto);
        }

        return resultList;

    }

    private Usuario carregarResultadoSimples(ResultSet rs) throws Exception {

        if (rs.next()) {
            Usuario dto = new Usuario();
            carregarVO(dto, rs);
            return dto;
        } else {
            return null;
        }

    }

    public void carregarVO(Usuario dto, ResultSet rs) throws Exception {
        try {
            dto.setIdUsuario(rs.getInt("IdUsuario"));
            dto.setNome(rs.getString("Nome"));
            dto.setLogin(rs.getString("Login"));
            dto.setSenha(rs.getString("Senha"));
        } catch (Exception e) {
        }
    }
}
